//
//  Person2.swift
//  swift-02
//
//  Created by China Dragon on 2023/8/19.
//

import UIKit
/*
 KVC构造函数
 */
class Person2: NSObject {
    /*
     Swift @objc的作用
     https://www.jianshu.com/p/4768d6ce8839
     
     Swift 4 'setValuesForKeys' 失效的问题
     https://www.jianshu.com/p/5726f2583b63
     在 swift 4.0 中，使用 setValuesForKeys 赋值会出现失败的情况，属性并没有被赋值。

     解决方法：
     swift3中，编译器自动推断@objc，自动添加@objc
     swift4中，编译器不再自动推断，必须显式添加@objc

     
    
     */
    
    // 在ios 所有的属性都是延时加载的
   @objc var name: String?;
    
    // age 和 kvc 不兼容， oc中的int是基本类型，不存在 nil 的 概念
   @objc var age: Int = 0; // 前面不加 @objc 运行时会报错
    
    //Swift中的Any、AnyObject、AnyClass介绍 https://www.jianshu.com/p/3f867e484d45
    //KVC构造函数 使用字典设置模型
    init(dic:[String: Any]){
        
        //kvc 是 oc 特有的，本质是在运行时，动态的给对象发送  setValue：forkey消息
        //设置数值- 调用  super.init()  保证对象已经被创建完成
        super.init()//使用setValuesForKeys 这里必先调用
        //KVC 设置数值
        setValuesForKeys(dic)// 代替以前的 setValuesForKeysWithDictionary
        
    }
    
    override class func setValue(_ value: Any?, forKey key: String) {
        print("setValue forKey key: \(key), value: \(value)")
        super.setValue(value, forKey: key)
    }
    
    /*
     KVC中setValuesForKeysWithDictionary 崩溃问题
     https://www.jianshu.com/p/6ed968158d36
     
     按住 com + shit + o  搜索 NSKeyvalueCoding , 找到 valueForUndefinedKey
     
     默认的 setValue forUndefinedKey 如果出现未定义的key会抛出 NSUndefinedKeyException 异常，让程序崩溃
     
     如果 重写了次方法，同时 不调用super  父类默认的方法，
     */
    override class func setValue(_ value: Any?, forUndefinedKey key: String) {
        print("setValue forUndefinedKey : key = \(key) , value = \(value) ")
    }
}
